package timer

import (
	"demo-2025/demo01/global"
	"demo-2025/demo01/model"
	"demo-2025/demo01/timer/tasks"
	"github.com/robfig/cron/v3"
	"go.uber.org/zap"
	"time"
)

// 负责从数据库加载任务，并注册到 cron 调度器。
// 任务加载器：从数据库加载任务
/*
说明
	任务开始时间：start := time.Now()
	执行耗时：duration := time.Since(start).Milliseconds()
	执行状态：
		成功：status = success
		失败：记录 errorMsg
	日志写入数据库：global.GVA_DB.Create(&log).Error
*/

// RegisterAllTasks 注册所有任务到注册表中
func RegisterAllTasks() {
	RegisterTask("ClearOrders", tasks.ClearOrders)
}

// LoadJobsFromDB 从数据库加载任务并注册到调度器
func LoadJobsFromDB(cr *cron.Cron) {
	// 查询数据库中启用的任务
	var jobs []model.SysJob
	err := global.GVA_DB.Where("status = ?", 1).Find(&jobs).Error
	if err != nil {
		global.GVA_LOG.Error("加载定时任务失败", zap.Error(err))
		return
	}
	// 遍历任务列表，逐一注册到调度器
	for _, job := range jobs {
		// 新建一个 jobCopy，确保每次循环隔离 job 内容
		jobCopy := job
		taskFunc, err := GetTask(jobCopy.InvokeTarget)
		if err != nil {
			global.GVA_LOG.Warn("找不到任务函数,"+job.InvokeTarget, zap.Error(err))
			continue
		}
		_, err = cr.AddFunc(job.Cron, func() {
			start := time.Now()
			global.GVA_LOG.Info("⏰ 开始执行任务：" + jobCopy.Name)
			execErr := taskFunc(job.Args)
			duration := time.Since(start).Milliseconds()
			log := model.SysJobLog{
				JobID:     jobCopy.ID,
				JobName:   jobCopy.Name,
				Args:      jobCopy.Args,
				StartTime: start,
				Duration:  duration,
				Status:    "success",
			}
			if execErr != nil {
				log.Status = "fail"
				log.ErrorMsg = execErr.Error()
				global.GVA_LOG.Error("任务执行失败: "+jobCopy.Name, zap.Error(err))
			} else {
				global.GVA_LOG.Info("任务完成: " + jobCopy.Name)
			}
			_ = global.GVA_DB.Create(&log).Error
		})
		if err != nil {
			global.GVA_LOG.Error("注册任务失败: "+job.Name, zap.Error(err))
		}
	}
}
